package algorithm.search;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Test {

	// 検索対象
	private static final String NUMBER_FOR_SEARCH = "7";

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {

		File file = new File("test.csv");
		BufferedReader bf = new BufferedReader(new FileReader(file));

		List<String> searchObj = new ArrayList<String>();
		String line;
		// csvファイルを読込み、リストへ詰め替える
		while ((line = bf.readLine()) != null) {
			searchObj.add(line);
		}
		// リストを配列に変換
		String[] array = (String[]) searchObj.toArray(new String[0]);

		System.out.println("線形検索start");

		long before = System.nanoTime();
		// 線形検索を実施
		int index = SearchUtil.linearSearchStr(array, NUMBER_FOR_SEARCH);
		long after = System.nanoTime();
		System.out.println("線形検索の所要時間 : " + (after - before) + "ナノ秒");
		showResult(index);

		System.out.println("番兵法start");

		String[] ex = new String[1];
		// 番兵にする配列の要素を一つ追加
		String[] dest = dinamicArr(array, ex);
		before = System.nanoTime();
		// 番兵法による検索を実施
		index = SearchUtil.seqSearchSenStr(dest, NUMBER_FOR_SEARCH);
		after = System.nanoTime();
		System.out.println("番兵法の所要時間 : " + (after - before) + "ナノ秒");
		showResult(index);

	}

	private static void showResult(int index) {

		if (index == -1) {
			System.out.println("その値の要素は存在しません。");
		}
		else {
			System.out.println("その値は" + "searchObj.get(" + index + ")にあります。");
		}
	}

	/**
	 * 二つの配列を結合するメソッド
	 * @param src
	 * @param src2
	 * @return
	 */
	private static String[] dinamicArr(String[] src, String[] src2) {

		String[] dest = new String[src.length + src2.length];

		System.arraycopy(src, 0, dest, 0, src.length);

		System.arraycopy(src2, 0, dest, src.length, src2.length);

		return dest;

	}
}
